{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Rack\n",
    "\n",
    "## Rackとは\n",
    "\n",
    "* Rubyのサーバとアプリケーション／フレームワーク間のインターフェースの役割を果たす<font color=\"red\">ライブラリ</font>\n",
    "    * WSGIに影響されて開発された\n",
    "        * PythonのためのWebサーバとWebアプリケーション/フレームワーク間の標準インターフェースを定める<font color=\"red\">仕様</font>\n",
    "        * WSGIの前の世界\n",
    "            * フレームワークの実装は特定のWebサーバに依存していることが多かった\n",
    "                * 使用したいフレームワークの為に環境を制限される\n",
    "                * 使用したいWebサーバの為にフレームワークを縛られる\n",
    "            * 対応するのは開発者も結構な負担\n",
    "                * 多数存在するサーバとアプリケーション／フレームワークがお互いに複数の環境に対応しなければならない\n",
    "        * 両者間の標準インターフェースが提唱された\n",
    "            * 以下ユーザの好みで組み合わせ可能となった\n",
    "                * WSGIに対応しているフレームワーク\n",
    "                * WSGIを介して連携できるWebサーバ\n",
    "* Rackの果たす役割\n",
    "    * 「アプリケーションサーバ」と「フレームワーク」の橋渡し\n",
    "        * 双方がRackを使用してインターフェース部分を実装するメリット\n",
    "            * 既存のWebアプリケーションをサーバ側の構成を変えることなく新しいフレームワークでリプレイス可能\n",
    "            * あるフレームワークで実装されたアプリケーションを様々な環境に容易に移せる\n",
    "    * <font color=\"red\">インターフェースが統一されていれば，サーバやフレームワークの組み合わせは自由</font>\n",
    "\n",
    "### 参考\n",
    "\n",
    "* [Rackとは何か](http://gihyo.jp/dev/serial/01/ruby/0023)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# インストール\n",
    "\n",
    "* Gemfile\n",
    "\n",
    "```\n",
    "================================================\n",
    "  gem 'rack'\n",
    "================================================\n",
    "```\n",
    "\n",
    "インストール手順\n",
    "\n",
    "```\n",
    "### インストールと初期ファイル作成\n",
    "$ bundle install --path vendor/bundle\n",
    "================================================\n",
    "Resolving dependencies...\n",
    "Using bundler 1.15.2\n",
    "Fetching rack 2.0.3\n",
    "Installing rack 2.0.3\n",
    "Bundle complete! 1 Gemfile dependency, 2 gems now installed.\n",
    "Bundled gems are installed into ./vendor/bundle.\n",
    "================================================\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# テスト\n",
    "\n",
    "```\n",
    "$ vi simple_app.rb\n",
    "================================================\n",
    "class SimpleApp\n",
    "  def call(env)\n",
    "    p env\n",
    "    case env['REQUEST_METHOD']\n",
    "    when 'GET'\n",
    "      [\n",
    "        200,\n",
    "        { 'Content-Type' => 'text/html' },\n",
    "        ['<html><body><form method=\"POST\"><input type=\"submit\" value=\"PUSH\" /></form></body></html>']\n",
    "      ]\n",
    "    when 'POST'\n",
    "      [\n",
    "        200,\n",
    "        { 'Content-Type' => 'text/html' },\n",
    "        ['<html><body>:-P</body></html>']\n",
    "      ]\n",
    "    end\n",
    "  end\n",
    "end\n",
    "================================================\n",
    "\n",
    "$ vi config.ru\n",
    "================================================\n",
    "require './simple_app.rb'\n",
    "run SimpleApp.new\n",
    "================================================\n",
    "\n",
    "$ bundle exec rackup -o 10.136.3.168 -p 3333\n",
    "================================================\n",
    "[2017-08-08 17:50:08] INFO  WEBrick 1.3.1\n",
    "[2017-08-08 17:50:08] INFO  ruby 2.3.4 (2017-03-30) [x86_64-linux]\n",
    "[2017-08-08 17:50:08] INFO  WEBrick::HTTPServer#start: pid=30275 port=3333\n",
    "================================================\n",
    "```\n",
    "\n",
    "ブラウザでアクセスすると以下のようなページが表示される\n",
    "\n",
    "<img src=\"img/rack01.png\" alt=\"rack01\" title=\"rack01\" width=\"300\" height=\"300\" align=\"left\" />  \n",
    "\n",
    "<br clear=\"left\">"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Ruby 2.4.1",
   "language": "ruby",
   "name": "ruby"
  },
  "language_info": {
   "file_extension": ".rb",
   "mimetype": "application/x-ruby",
   "name": "ruby",
   "version": "2.4.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
